package com.cquprt.Tcp;


import lombok.extern.slf4j.Slf4j;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static com.cquprt.utils.TcpSocket.closeSAndC;
import static com.cquprt.utils.TcpSocket.writeData;

/**
 * 功能：建立Tcp连接
 */
@Slf4j
public class TcpTransitMsgByte {
    private static String msg=null;
    private static String[] bytes;
    private static List<Byte> realBytes=null;
    private static byte[] data;
    static {
        Scanner scanner=new Scanner(System.in);
        new Thread(() -> {
            while (true){
                if (realBytes==null) {
                    System.out.println("请输入数据测试");
                    msg = scanner.nextLine();
                    bytes=msg.split(" ");
                    //以空格分开
                    realBytes=new ArrayList<>();
                    for (int i=0;i< bytes.length;i++){
                        //判断是否为数字
                        if (isStringNum(bytes[i])) {//为数字
                            realBytes.add ((byte) Integer.parseInt(bytes[i]));
                        }else {//不为数字
                            //将字符串转换为数组
                            byte[] tmp=bytes[i].getBytes();
                            //字符串长度
                            int length=tmp.length;
                            int j;
                            for (j=i;j<length+i;j++) {
                                realBytes.add(tmp[j-i]);
                            }
                            i=j;
                        }
                    }
                    data=new byte[realBytes.size()];
                    for (int i=0;i<realBytes.size();i++) {
                        data[i]=realBytes.get(i);
                    }
                }
            }
        }).start();
    }

    /**
     * 功能：建立Tcp连接，发送数据
     * @param ip 需要连接的对象的ip
     * @param port 需要连接的对象的端口号
     */
    public static void transitMsg(String ip,int port){
        Socket client=null;
        InetAddress ia;
        BufferedOutputStream bo=null;
        try {
            ia=InetAddress.getByName(ip);
            System.out.println("客户端准备建立连接");
            client=new Socket(ia,port);
            System.out.println("客户端建立连接成功！！！");
            bo=new BufferedOutputStream(client.getOutputStream());
            while (true){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //写数据
                if (realBytes!=null){
                    //要写什么数据过去
                    writeData(data, bo);
                    realBytes=null;
                }
            }
        } catch (IOException e) {
            log.info(e.getMessage());
        }finally {
            //关流
            closeSAndC(null,null,null,bo,null,client);
            transitMsg(ip,port);
        }
    }

    /**
     * 功能：使用正则表达式判断是否为数字
     * @param num 需要判断的字符串
     * @return 为数字返回true,反之为false
     */
    public static boolean isStringNum(String num){
        Pattern pattern=Pattern.compile("-?[0-9]+\\.?[0-9]*");//匹配所有数字，包括小数点
        Matcher isNum=pattern.matcher(num);
        return isNum.matches();
    }
}
